package middle.code01_window_preprocess;

import lombok.extern.slf4j.Slf4j;

/**
 * 小虎去附近的商店买苹果，奸诈的商贩使用了捆绑交易，只提供6个每袋和8个每袋的包装包装不可拆分。
 * 可是小虎现在只想购买恰好n个苹果，小虎想购买尽量少的袋数方便携带。
 * 如果不能购买恰好n个苹果，小虎将不会购买。输入一个整数n，表示小虎想购买的个苹果，返回最小使用多少袋子。
 * 如果无论如何都不能正好装下，返回-1。
 */
@Slf4j
public class Code02_Apples {
    /**
     * 为了使用的袋子尽可能少，则应该尽可能地使用 8个袋
     */
    private static int apples1(int n) {
        int maxBigBagCnt = n / 8;
        for (int bigBagCnt = maxBigBagCnt; bigBagCnt >= 0; bigBagCnt--) {
            int rest = n - bigBagCnt * 8;
            if (rest % 6 == 0) {
//                log.info("small bag number: {}", rest / 6);
                return rest / 6 + bigBagCnt;
            }
        }
        return -1;
    }

    /**
     * 打表法
     * 输入参数是整数，输出参数是整数(或者字符等很简单的类型)，先写一个简单的最容易想的解法，
     * 然后利用对数器输出一个很大范围上的结果，看输出的结果有什么规律，根据这种规律，输入什么按照规律直接输出结果
     *
     * apple number: 1, bag number: -1
     * apple number: 2, bag number: -1
     * apple number: 3, bag number: -1
     * apple number: 4, bag number: -1
     * apple number: 5, bag number: -1
     * apple number: 6, bag number: 1
     * apple number: 7, bag number: -1
     * apple number: 8, bag number: 1
     * apple number: 9, bag number: -1
     * apple number: 10, bag number: -1
     * apple number: 11, bag number: -1
     * <p>
     * apple number: 12, bag number: 2
     * apple number: 13, bag number: -1
     * apple number: 14, bag number: 2
     * apple number: 15, bag number: -1
     * apple number: 16, bag number: 2
     * apple number: 17, bag number: -1
     * <p>
     * apple number: 18, bag number: 3
     * apple number: 19, bag number: -1
     * apple number: 20, bag number: 3
     * apple number: 21, bag number: -1
     * apple number: 22, bag number: 3
     * apple number: 23, bag number: -1
     * apple number: 24, bag number: 3
     * apple number: 25, bag number: -1
     * <p>
     * apple number: 26, bag number: 4
     * apple number: 27, bag number: -1
     * apple number: 28, bag number: 4
     * apple number: 29, bag number: -1
     * apple number: 30, bag number: 4
     * apple number: 31, bag number: -1
     * apple number: 32, bag number: 4
     * apple number: 33, bag number: -1
     */
    private static int apples2(int n) {
        if (n % 2 == 1) {
            return -1;
        }
        if (n <= 11) {
            return n == 6 || n == 8 ? 1 : -1;
        }
        if (n <= 17) {
            return 2;
        }
        return (n - 18) / 8 + 3;
    }

    public static void main(String[] args) {
        log.info("apple number: {}, bag number: {}", 73, apples1(73));
        for (int i = 1; i < 300; i++) {
            if (apples1(i) != apples2(i)) {
                log.error("ooooooops! {}", i);
            }
        }
    }
}
